import time
import pyvisa as visa
# 固件的路径
visa_dll = 'c:/windows/system32/visa32.dll'
rm = visa.ResourceManager(visa_dll)
# 设备的USB地址 在设备上进行查看，此处有两个设备
usb_addr1 = 'USB0::0x1AB1::0x0642::DG1ZA201902214::INSTR'  # 编号为 GEN_007
usb_addr2 = 'USB0::0x1AB1::0x0642::DG1ZA212302446::INSTR'  # 编号为 AF2014

POINT_COUNT_X = 16000  # 横轴最大点数
POINT_COUNT_Y = 16380  # 纵轴最大点数


def connect_waveform_generator():
    """
    对信号发生器进行连接
    :return: 失败返回None，连接成功返回 设备上下文
    """
    usb_inst = None
    try:
        usb_inst = rm.open_resource(usb_addr1)  # 两个信号发生器不同的句柄均连接测试
        return usb_inst
    except:
        try:
            usb_inst = rm.open_resource(usb_addr2)
            return usb_inst
        except:
            print("信号发生器连接失败")
            return usb_inst


def draw_waveform(usb_inst, dataBuff):
    """
    根据Buf中的内容 对设备进行点编辑
    :param usb_inst: 设备上下文
    :param dataBuff: 需要传入的数据
    :return: None
    """
    VDD = 3.8
    Voffset = 0
    Vh = VDD + Voffset
    Vl = Vh / 2
    dataLen = len(dataBuff)
    usb_inst.write(":OUTP1 OFF")            # 关闭通道一
    # usb_inst.write(":SOUR1:FREQ 1")      # 设置频率（min 1Hz），长周期可以手动设置
    usb_inst.write(":SOUR1:VOLT %s" % str(Vh))         # 高电平
    usb_inst.write(":SOUR1:VOLT:OFFS %s" % str(Vl))    # 低电平偏移

    usb_inst.write(":DATA:POIN VOLATILE,%s" % (str(dataLen)))  # 设置总点数
    for index in range(1, POINT_COUNT_X):    # 开始点编辑
        print(str(buf[index - 1]) + "," + str(index))
        usb_inst.write(":DATA:VAL VOLATILE,%s,%s" % (str(index), str(int(buf[index - 1]))))
        time.sleep(0.02)   # 设备接收速度较慢，如果速度过快容易丢失
    print("set over !!!")
    usb_inst.write(":OUTP1 ON")  # 开启通道一 输出波形



waveform = connect_waveform_generator()  # 获取设备上下文
buf = [0 for i in range(POINT_COUNT_X)]  # 初始化buf

# 此处生成一个线性的上升沿，中间保持高电平，然后指数函数缓慢掉电的下降沿
k = (POINT_COUNT_Y - 0) / (1 - 0)      # 计算上升沿斜率k = (y2-y1)/(x2-x1)
for i in range(POINT_COUNT_X):
    if i < 2:
        buf[i] = k * i
    elif 2 <= i <= 1000:
        buf[i] = POINT_COUNT_Y
    else:
        buf[i] = POINT_COUNT_Y * ((1498 / 1500) ** float(i - 1000))

# 绘画出波形
draw_waveform(waveform, buf)
